package main

import (
	"context"
	"fmt"
	"greatTool/command"
	"greatTool/db"
	"os"

	"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
	Use:   "ttl",
	Short: "个人数据管理体系",
	Long: `个人数据管理体系，用于管理资源和标签。
支持多种操作如添加、获取、删除资源，以及管理标签等。`,
	Run: func(cmd *cobra.Command, args []string) {
		_ = cmd.Help()
	},
}

var debug bool
var storageType string
var cloudAPIURL string
var cloudAPIKey string
var cloudTimeout int

func init() {
	// 全局标志
	rootCmd.PersistentFlags().BoolVarP(&debug, "debug", "D", false, "开启 debug 模式")
	rootCmd.PersistentFlags().StringVar(&storageType, "storage", "local", "存储类型: local, cloud, sync")
	rootCmd.PersistentFlags().StringVar(&cloudAPIURL, "cloud-url", "", "云存储API地址")
	rootCmd.PersistentFlags().StringVar(&cloudAPIKey, "cloud-key", "", "云存储API密钥")
	rootCmd.PersistentFlags().IntVar(&cloudTimeout, "cloud-timeout", 30, "云存储超时时间(秒)")

	// 禁用默认的completion命令
	rootCmd.CompletionOptions.DisableDefaultCmd = true

	// 添加子命令
	rootCmd.AddCommand(command.AddCmd)
	rootCmd.AddCommand(command.GetCmd)
	rootCmd.AddCommand(command.OpenCmd)
	rootCmd.AddCommand(command.UpdateCmd)
	rootCmd.AddCommand(command.DelCmd)
	rootCmd.AddCommand(command.TagCmd)
	rootCmd.AddCommand(command.DtagCmd)
	rootCmd.AddCommand(command.RenameCmd)
	rootCmd.AddCommand(command.ConfigCmd)
	rootCmd.AddCommand(command.VersionCmd)
	rootCmd.AddCommand(migrateCmd)
	rootCmd.AddCommand(command.AuditCmd)
	rootCmd.AddCommand(command.HistoryCmd)

}

// main.go 使用更简单的方法
func main() {
	// 初始化数据库
	if err := db.InitDB(storageType, cloudAPIURL, cloudAPIKey, cloudTimeout); err != nil {
		fmt.Printf("初始化数据库失败: %v\n", err)
		os.Exit(1)
	}
	defer func() {
		err := db.CloseDB()
		if err != nil {
			// nothing .
		}
	}()

	// 设置PreRunE来记录历史
	rootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error {

		ctx := context.WithValue(cmd.Context(), "debug", debug)
		cmd.SetContext(ctx)

		// replace special values.
		replaceSpecialValuesFromHistory(args)

		// 只在叶子命令（实际执行的命令）记录历史
		if !cmd.HasSubCommands() && cmd.Name() != "history" && cmd.Name() != "audit" {
			resourceKey := ""
			if len(args) > 0 {
				resourceKey = args[0]
			}
			if err := db.RecordCommandHistory(cmd.Name(), resourceKey, debug); err != nil && debug {
				fmt.Printf("记录命令历史失败: %v\n", err)
			}
		}
		return nil
	}

	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func replaceSpecialValuesFromHistory(args []string) {
	if len(args) != 1 {
		return
	}
	charsCount := countSpecialChars(args[0])
	if charsCount > 0 {
		record, err := db.GetHistoryRecords(charsCount - 1)
		if err != nil {
			fmt.Printf("获取命令历史失败: %v\n", err)
		}
		args[0] = record.ResourceKey
	}

}

func countSpecialChars(input string) int {
	count := 0
	for _, char := range input {
		if char == '~' || char == '^' {
			count++
		} else {
			// 如果发现其他字符，立即返回0
			return 0
		}
	}
	return count
}
